Через этот метод другие объекты получают указатели на интерфейсы данного класса. Ситуация здесь такая. Вообщем-то правила COM не дают возможности узнать какие имена интерфейсов есть. Эти имена надо знать заранее. Объявляется этот интерфейс в классе так.
class COAbsatract : public COleTestAbstract,
public IUnknown
{
public:
......
STDMETHOD_ (HRESULT, QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppObj);
......
};
Кроме объявления необходима еще и реализация. Вот один из примеров реализации.
STDMETHODIMP_ (HRESULT) COAbsatract::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppObj)
{
HRESULT retCode=NOERROR;
ppObj=0;
if (IsEqualIID(riid,IID_IUnknown))
{
*ppObj=this;
AddRef();
}
else retCode = E_NOINTERFACE;
return retCode;
}
Идея такова. При обращении к этому методу возвращается this и клиент получает указатель на остальные методы объекта. Функция IsEqualIID сравнивает два интерфейса. Вот её описание.
BOOL IsEqualIID ( REFGUID riid1, REFGUID riid2 );
Естественно, что возвращает либо TRUE либо FALSE. Вообщем написано примерно на русском вот что. Если запрашиваемый интерфейс Uinknown, то вернуть указатель на себя (класс, в котором этот интрефейс реализован). Осталось разобраться, что это за IID_IUnknown. Это уникальный номер CLSID, который определяет интерфейс. Вообщем клиент должен передать этот номер в нашу функцию QueryInterface, а в ответ получит указатель. Это справедливо для всех систем, которые используют COM вне зависимости от реализации.